[PR]

水無瀬の部屋 > Programming > sample > tools > susie > susie.cpp
最終更新日: 2007/03/29

   1: //*********************************************************
   2: // プロジェクト: susie
   3: //   ファイル名: susie.cpp
   4: //*********************************************************
   5: #include <susie/susie.h>       //
   6: #include <header/tooldbg.h>    // ASSERT(), VERIFY(), 
   7: #include <header/toolbase.h>   // 
   8: #include <header/toolsys.h>
   9: #include <limits.h>            // INT_MAX,  
  10: 
  11: 
  12: //---------------------------------------------------------
  13: // マクロ の 定義
  14: //---------------------------------------------------------
  15: #define REGPATH_SUSIEPLUGIN        "Software\\Takechin\\Susie\\Plug-in"
  16: #define REGSUBKEY_SUSIEPLUGINPATH  "Path"
  17: 
  18: 
  19: //---------------------------------------------------------
  20: // ファイルスコープ関数 の 宣言
  21: //---------------------------------------------------------
  22: static int PASCAL Susie_DummyProgressCallback( int, int, long );
  23: static bool OpenRegKeySusiePluginPath( HKEY *phKey, REGSAM samDesired );
  24: 
  25: 
  26: //*********************************************************
  27: // GetSusiePluginPath
  28: // 既に Susie がインストールされている場合に
  29: // Susie が参照しているプラグイン・フォルダを得る 
  30: //*********************************************************
  31: bool
  32: GetSusiePluginPath
  33: 	(
  34: 		char *buf,
  35: 		int   bufsize
  36: 	)
  37: {
  38: 	// パラメタの仮定
  39: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
  40: 	ASSERT( IsValidStringBufferPtr( buf, bufsize ) );
  41: 	DESTROY_TEXT_BUFFER( buf, bufsize ); // [破壊]
  42: 
  43: 	HKEY hkeySusiePlugin;
  44: 	if ( !OpenRegKeySusiePluginPath( &hkeySusiePlugin, KEY_READ ) )
  45: 	{
  46: 		return false;
  47: 	}
  48: 
  49: 	buf[ 0 ] = '\0';
  50: 	VERIFY( GetRegKeyString( hkeySusiePlugin, REGSUBKEY_SUSIEPLUGINPATH, buf, bufsize ) );
  51: 	VERIFY( CloseRegKey( hkeySusiePlugin ) );
  52: 
  53: 	ASSERT( IsValidLocalPathString( buf ) );
  54: 	return true;
  55: }//GetSusiePluginPath
  56: 
  57: //*********************************************************
  58: // Susie_GetPluginInfo
  59: // プラグインの種類を得る
  60: //*********************************************************
  61: bool
  62: Susie_GetPluginInfo
  63: 	(
  64: 		GetPluginInfo_t  GetPluginInfo,
  65: 		int             *pType
  66: 	)
  67: {
  68: 	// パラメタの仮定
  69: 	ASSERT( IsValidPtr( pType, sizeof( *pType ) ) );
  70: 	ASSERT( IsValidCodePtr( GetPluginInfo ) );
  71: 
  72: 	//
  73: 	char buf[ 16 ]; //
  74: 	memzero( buf, sizeof(buf) );
  75: 	const int len = GetPluginInfo( 0, buf, 4 );
  76: 	if ( (len < 3) || (sizeof(buf) < len) || ('0' != buf[0]) || ('0' != buf[1]) )
  77: 	{
  78: 		return false;
  79: 	}
  80: 
  81: 	//
  82: 	int type = 0;
  83: 	ASSERT( (3 <= len) && (len <= 4)  && ('0' == buf[0]) && ('0' == buf[1]) );
  84: 	{for( int i = 0; (i < min(4, len) ) && ('\0' != buf[i]); ++i )
  85: 	{
  86: 		if ( 'I' == buf[i] ) type |= SPI_TYPE_IMPORT;
  87: 		if ( 'X' == buf[i] ) type |= SPI_TYPE_EXPORT;
  88: 		if ( 'A' == buf[i] ) type |= SPI_TYPE_ARCHIVE;
  89: 		if ( 'C' == buf[i] ) type |= SPI_TYPE_COLOR;
  90: 		if ( 'E' == buf[i] ) type |= SPI_TYPE_EFFECT;
  91: 		if ( 'M' == buf[i] ) type |= SPI_TYPE_MULTI;
  92: 	}}
  93: 
  94: 	//
  95: 	*pType = type;
  96: 	return true;
  97: }//Susie_GetPluginInfo
  98: 
  99: //*********************************************************
 100: // Susie_IsSupported
 101: //*********************************************************
 102: bool
 103: Susie_IsSupported
 104: 	(
 105: 		      IsSupported_t  IsSupported,
 106: 		const char          *filename,
 107: 		const BYTE          *head, 
 108: 		      int            length
 109: 	)
 110: {
 111: 	// パラメタの仮定
 112: 	ASSERT( IsPathFile( filename ) );
 113: 	ASSERT( (0 <= length) && (length <= 2048) );
 114: 	ASSERT( IsValidReadPtr( head, length ) );
 115: 	ASSERT( IsValidCodePtr( IsSupported ) );
 116: 
 117: 	//
 118: 	// head を破壊する plugin があるので head を直接は渡せない!
 119: 	BYTE buffer[ 2048 ];
 120: 	memzero( buffer, sizeof(buffer) );
 121: 	memmove( buffer, head, length );
 122: 
 123: 	// filename を破壊する plugin があるので filename を直接は渡せない!
 124: 	char copyname[ MAX_PATH_BUF ];
 125: 	strcopy( copyname, numof(copyname), filename );
 126: 
 127: 	//
 128: 	return 0 != IsSupported
 129: 		(
 130: 			copyname,			
 131: 			_w64_static_cast<DWORD>( reinterpret_cast<DWORD_PTR>( buffer ) ) // _W64
 132: 		);
 133: }//Susie_IsSupported
 134: 
 135: //*********************************************************
 136: // Susie_GetArchiveInfo
 137: //*********************************************************
 138: HLOCAL
 139: Susie_GetArchiveInfo
 140: 	(
 141: 		      GetArchiveInfo_t  GetArchiveInfo,
 142: 		const char             *filename
 143: 	)
 144: {
 145: 	// パラメタの仮定
 146: 	ASSERT( IsPathFile( filename ) );	
 147: 	ASSERT( IsValidCodePtr( GetArchiveInfo ) );
 148: 
 149: 	//
 150: 	HLOCAL hArchiveInfo = null;
 151: 	
 152: 	// filename を破壊する plugin があるので filename を直接は渡せない!
 153: 	char copyname[ MAX_PATH_BUF ];
 154: 	strcopy( copyname, numof(copyname), filename );
 155: 	if ( ERR_NoError != GetArchiveInfo( copyname, 0, 0, &hArchiveInfo ) )
 156: 	{
 157: 		return null;
 158: 	}
 159: 
 160: 	// 失敗しても ERR_NoError を返す plugin があるので hArchiveInfo は信用できない!
 161: 	if ( !IsValidLocalMemoryEx( hArchiveInfo, sizeof(fileinfo_t), INT_MAX ) )
 162: 	{
 163: 		return null;
 164: 	}
 165: 
 166: 	ASSERT( IsValidLocalMemoryEx( hArchiveInfo, sizeof(fileinfo_t), INT_MAX ) );
 167: 	return hArchiveInfo;
 168: }//Susie_GetArchiveInfo
 169: 
 170: //*********************************************************
 171: // Susie_GetFile
 172: //*********************************************************
 173: HLOCAL 
 174: Susie_GetFile
 175: 	(
 176: 		      GetFile_t  GetFile,
 177: 		const char      *filename,
 178: 		      ULONG      offset,
 179: 		      int        filesize
 180: 	)
 181: {
 182: 	// パラメタの仮定
 183: 	ASSERT( 0 < filesize );	
 184: 	ASSERT( IsPathFile( filename ) );	
 185: 	ASSERT( IsValidCodePtr( GetFile ) );
 186: 
 187: 	//
 188: 	HLOCAL hData = null;
 189: 
 190: 	// filename を破壊する plugin があるので filename を直接は渡せない!
 191: 	char copyname[ MAX_PATH_BUF ];
 192: 	strcopy( copyname, numof(copyname), filename );
 193: 	if ( ERR_NoError != GetFile( copyname, offset, (LPSTR)&hData, 0x0100, (FARPROC)Susie_DummyProgressCallback, 0 ) )
 194: 	{
 195: 		return null;
 196: 	}
 197: 
 198: 	// 失敗しても ERR_NoError を返す plugin があるので hData は信用できない!
 199: 	if ( !IsValidLocalMemoryEx( hData, filesize, INT_MAX ) )
 200: 	{
 201: 		return null;
 202: 	}
 203: 
 204: 	//
 205: 	ASSERT( IsValidLocalMemoryEx( hData, filesize, INT_MAX ) );
 206: 	return hData;
 207: }//Susie_GetFile
 208: 
 209: //*********************************************************
 210: // Susie_GetPicture
 211: //*********************************************************
 212: bool
 213: Susie_GetPicture
 214: 	(
 215: 		      GetPicture_t  GetPicture,
 216: 		const char         *filename,
 217: 		      HLOCAL       *phBmpInfo, 
 218: 		      HLOCAL       *phImage
 219: 	)
 220: {
 221: 	// パラメタの仮定
 222: 	ASSERT( IsValidCodePtr( GetPicture ) );
 223: 	ASSERT( IsValidPtr( phBmpInfo, sizeof( *phBmpInfo ) ) );
 224: 	ASSERT( IsValidPtr( phImage, sizeof( *phImage ) ) );
 225: 	ASSERT( IsPathFile( filename ) );
 226: 
 227: 	//
 228: 	HLOCAL hImage = null;
 229: 	HLOCAL hBmpInfo = null;
 230: 
 231: 	// filename を破壊する plugin があるので filename を直接は渡せない!
 232: 	char copyname[ MAX_PATH_BUF ];
 233: 	strcopy( copyname, numof(copyname), filename );
 234: 	if ( ERR_NoError != GetPicture( copyname, 0, 0, &hBmpInfo, &hImage, (FARPROC)Susie_DummyProgressCallback, 0 ) )
 235: 	{
 236: 		return false;
 237: 	}
 238: 	
 239: 	// 失敗しても ERR_NoError を返す plugin があるので hImage は信用できない!
 240: 	if ( ! IsValidLocalMemory( hImage ) )
 241: 	{
 242: 		return false;
 243: 	}
 244: 
 245: 	// 失敗しても ERR_NoError を返す plugin があるので hBmpInfo は信用できない!
 246: 	if ( ! IsValidLocalMemoryEx( hBmpInfo, sizeof(BITMAPINFOHEADER), INT_MAX ) )
 247: 	{
 248: 		return false;
 249: 	}
 250: 
 251: 	*phImage   = hImage;
 252: 	*phBmpInfo = hBmpInfo;
 253: 
 254: 	ASSERT( IsValidLocalMemoryEx( *phBmpInfo, sizeof(BITMAPINFOHEADER), INT_MAX ) );
 255: 	ASSERT( IsValidLocalMemoryEx( *phImage, 1, INT_MAX ) );
 256: 	return true;
 257: }//Susie_GetPicture
 258: 
 259: 
 260: //******************************************************************************************************************
 261: // private
 262: //******************************************************************************************************************
 263: //*********************************************************
 264: // OpenRegKeySusiePluginPath
 265: //*********************************************************
 266: static
 267: bool
 268: OpenRegKeySusiePluginPath
 269: 	(
 270: 		HKEY   *phKey,
 271: 		REGSAM  samDesired
 272: 	)
 273: {
 274: 	// パラメタの仮定
 275: 	ASSERT( IsValidPtr( phKey, sizeof( *phKey ) ) );
 276: 
 277: 	return OpenRegKey
 278: 		(
 279: 			HKEY_CURRENT_USER,
 280: 			REGPATH_SUSIEPLUGIN,
 281: 			samDesired,
 282: 			phKey
 283: 		);
 284: }//OpenRegKeySusiePluginPath
 285: 
 286: 
 287: //******************************************************************************************************************
 288: // private
 289: //******************************************************************************************************************
 290: //*********************************************************
 291: // Susie_DummyProgressCallback
 292: // 仕様では省略できるはずだが実際には無いと落ちる plugin がある。
 293: //*********************************************************
 294: static
 295: int
 296: PASCAL
 297: Susie_DummyProgressCallback
 298: 	(
 299: 		int,
 300: 		int,
 301: 		long
 302: 	)
 303: {
 304: 	return 0;
 305: }//Susie_DummyProgressCallback
 306: 
 307: 
 308: //** end **
 309: 

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > susie > susie.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/susie/susie_cpp.shtml
『新妻LOVELY×CATION』を応援しています!